package gestordeentidades.persistance.interfaces;

import gestordeentidades.identitymap.interfaces.IEntityMap;
import java.util.Map;
import gestordeentidades.persistance.DataBaseObject;

/**
 * Trabalho DAS - 2014/2015
 * Interface a ser definido por classes concretas que suportam as operações 
 * de inserção, remoção, atualização procurar de uma entidade
 * @author a21210380, a21190325, a21210392
 * @param <T> extends DataBaseObject para ter acesso ao id do objecto
 */
public interface IGateway <T extends DataBaseObject> {

    /**
     * Executa o sql para criar a tabela da entidade caso não exista
     * @param dataBase adapatador da base de dados para executar sql
     */
    public void initTable(IDataBaseAdapter dataBase);

    /**
     * Executa o sql para fazer drop da tabela, da entidade
     * @param dataBase adapatador da base de dados para executar sql
     */
    public void dropTable(IDataBaseAdapter dataBase);

    /**
     * Insere uma entidade na base de dados.
     * @param dataBase adapatador da base de dados para executar sql
     * @param object entidade a inserir 
     * @return true como sucesso
     */
    public boolean inserirNovaEntidade(IDataBaseAdapter dataBase, T object);

    /**
     * Actualiza uma entidade na base de dados.
     * @param dataBase adapatador da base de dados para executar sql
     * @param object entidade a atualizar 
     * @return true como sucesso
     */
    public boolean atualizarEntidade(IDataBaseAdapter dataBase, T object);
    
    /**
     * Apaga uma entidade da base de dados.
     * @param dataBase adapatador da base de dados para executar sql
     * @param object entidade a apagar
     * @return true como sucesso
     */
    public boolean apagarEntidade(IDataBaseAdapter dataBase, T object);
    
    /**
     * Procurar uma entidade pelo id, na base de dados.
     * Utiliza o IEntityMap para procurar entidades caso possam já existir em memória
     * @param dataBase adapatador da base de dados para executar sql
     * @param entityMap mapa de entidades
     * @param id da entidade a procurar
     * @return a entidade encontrada, ou null caso não seja encontrada
     */
    public T procurarEntidadePeloID(IDataBaseAdapter dataBase, IEntityMap entityMap, int id);

    /**
     * Procurar todas as entidades
     * @param dataBase adapatador da base de dados para executar sql
     * @param entityMap mapa de entidades
     * @return Map
     */
    public Map<Integer, T> procurarPorTodasAsEntidadesComoMapa(IDataBaseAdapter dataBase, IEntityMap entityMap);
}
